home *** CD-ROM | disk | FTP | other *** search
/ Windows News 2010 Summer - Disc 1 / WN_Ete2010_CD1.iso / Onglet5 / Weezo / Weezo setup.exe / {code_appDir} / www / js / remoteDesktop-src.js < prev    next >
Text File  |  2010-05-19  |  25KB  |  784 lines

  1. var XX,YY; // Mouse coordinates
  2. var startX,startY; // Mouse drag start coordinates
  3. var winState='normal'; // Current window state ('minMax', 'minNormal') (used to stop refreshing when viewport hidden)
  4. var mixedEvents=''; // Mouse / keyboard event string sent to server. Events are separated by a slash
  5. var keyEvents=''; // Keyboard events
  6. var keyPressedCalled=0;
  7. var rdTimeout=false; // Tiemout used to sendEvents()
  8. var focusInterval;// window interval used to keep focus on keys2 input, toggled with resumeFocus(0/1);
  9. var inputBoxDragInProgress=0;
  10. var sendEventsInProgress=0; // 1 if a sendData request is in progress
  11. var sendEventsImmediately=0;
  12. var maskDragInProgress=0;
  13. var inputBoxFocused=0;
  14. var clipboardBoxFocused=0;
  15. var keyBuffer="";
  16. var lastKeyPressedKC=0;
  17. var lastKeyDownDate=0; // Time(ms) of last processed keydown, used to prevent double keystrokes under FF
  18. var shiftDown=false; var shiftUsed=0;
  19. var ctrlDown=false; var ctrlUsed=0;
  20. var altDown=false; var altUsed=0;
  21. var showMouseIcon=1;
  22. var pws="";
  23. var maskFaded=1;
  24. var inputsDisabled=0;
  25. var mouseIn=1; // 1 if mouse over mask/window
  26. var dbsl=0,dbst=0; // D.body.scrollTop/Left
  27.  
  28.  
  29. /******************************************************************************
  30.  * Misc functions
  31.  *****************************************************************************/
  32. function stopLoading(){
  33.     windowStop();
  34.     var n,i=0;
  35.     while(n=dgi("sq"+i)) {imgBuff[i].src=n.src="/gfx/v.gif";i++}
  36. }
  37. /**
  38.  * Called before showing resouce configuration form
  39.  */
  40. function beforeConfigureResource(){}
  41.  
  42. /**
  43.  * Set mouse in or out of window
  44.  */
  45. var mouseAreaLastXY;
  46. function winMouseIn(){
  47.         mouseIn=1;
  48.         resumeFocus(1);
  49.         //dgi('debugDiv').innerHTML='in'
  50. }
  51. function winMouseOut(){
  52.     mouseIn=0;
  53.     resumeFocus(0);
  54. }
  55.  
  56.  
  57. /**
  58.  * Start / Stop focussing on keys2 input to get keyboard events
  59.  */
  60. function resumeFocus(f){
  61.     if(altClick) return; // Never use keys2 focus with alternate click menu
  62.     // Resume focussing
  63.     if(f && !focusInterval && !focusIntervalSuspended && dgi('keys2')){
  64.         focusInterval=setInterval("dgi('keys2').focus()",100);
  65.     }
  66.     // Stop focussing
  67.     if(!f && focusInterval){
  68.         clearInterval(focusInterval);
  69.         focusInterval=0;
  70.     }
  71. }
  72.  
  73. // Set inputBox and controlBox dimensions so content fit (WA)
  74. function inputBoxesResetSize(){
  75.     if(dd.elements["controlBox"]) dd.elements["controlBox"].resizeTo(actualOffsetRight(dgi("controlBoxLE"))-actualOffsetLeft(dgi("controlBox"))+10,false);
  76.     if(dd.elements["inputBox"]) dd.elements["inputBox"].resizeTo(actualOffsetRight(dgi("inputBoxLE"))-actualOffsetLeft(dgi("inputBox"))+10,false);
  77. }
  78. function toggleDebug(){
  79.     debug=!debug;
  80.     if(debug) dgi('debugDiv').style.display="block"; else dgi('debugDiv').style.display="none";
  81. }
  82. function trace(txt){if(dgi('debugDiv')) dgi('debugDiv').innerHTML=txt+'<br>'+dgi('debugDiv').innerHTML;}
  83. function unprotect(str){
  84.     return str.replace(/&/gi,"&").replace(/</gi,"<").replace(/!weezobr!/gi,String.fromCharCode(10));
  85. }
  86. function protect(str){
  87.     return str.replace(/[\/]/gi,"*weezoslash*").replace(/[&]/gi,"*weezoamp*");
  88. }
  89. /**
  90.  * (re) set main event timeout.
  91.  * @param: newInt: new timeout, in ms
  92.  * @param preserveExistingTimeout: true to use current timeout if already set
  93.  */
  94.  
  95. function setEvtInterval(newInt,preserveExistingTimeout){
  96.     if(rdTimeout!==false) {
  97.         if(preserveExistingTimeout) return;
  98.         clearTimeout(rdTimeout);
  99.     }
  100.     rdTimeout=false;
  101.     if(newInt) rdTimeout=setTimeout('sendEvents()',newInt);
  102.     else sendEventsImmediately=0;
  103. }
  104. // Safety timer called by sendEvents on request cancel because another request is already in progress
  105. function eventTimeoutSafety(){
  106.     if(!eventTimeoutSafetySet) return; // If a new request has been fired since eventTimeoutSafety set, cancel
  107.     sendEventsInProgress=0;
  108.     sendEvents();
  109. }
  110. // Window minimized or state changed
  111. function winStateChanged(prev,current){
  112.     winState=current;
  113.     if(current=='minMax' || current=='minNormal') {
  114.         winMouseOut();
  115.         setEvtInterval(0);
  116.     }
  117.     else if(prev=='minMax' || prev=='minNormal') {
  118.         sendEvents();
  119.     }
  120. }
  121. function setMouseIcons(iHTML){
  122.     if(!showMouseIcon) return;
  123.     dgi("mouseIcons").innerHTML+=iHTML;
  124.     // Set mouseIcons layer below mask layer
  125.     if(dd.elements["mask"]) dd.elements["mask"].maximizeZ();
  126.     if(dd.elements["inputBox"]) dd.elements["inputBox"].maximizeZ();
  127.     if(dd.elements["controlBox"]) dd.elements["controlBox"].maximizeZ();
  128.     if(dd.elements["clipboardBox"]) dd.elements["clipboardBox"].maximizeZ();
  129. }
  130. function clearMouseIcons(){dgi("mouseIcons").innerHTML='';}
  131. function blink(eltName,times,action){
  132.     if(!action) action="hide";
  133.     if(winMe.addControls) elts=parent.D.getElementsByName(eltName);
  134.     else elts=D.getElementsByName(eltName);
  135.     for(var i=0;i<elts.length;i++){
  136.         if(action=="hide") elts[i].style.visibility="hidden"; else elts[i].style.visibility="visible";
  137.     }
  138.     if(action=="hide") setTimeout('blink("' + eltName + '", ' + times + ', "show")',100);
  139.     else {
  140.         if((times--)>0) setTimeout('blink("' + eltName + '", ' + (times) + ', "hide")',100);
  141.     }
  142. }
  143.  
  144. // Update "keys in progress" box with current key events and modifiers
  145. function modKeyIcon(mk){return '<img src="/gfx/v.gif" class="modKey '+mk+'">'}
  146. function gfxKE(ke){
  147.     ke=ke.replace(/[+]/g,'*plus*').replace(/%/g,'*alt*').replace(/\^/g,'*ctrl*')
  148.     ke=ke.replace(/{\*plus\*}/g,'+').replace(/{\*alt\*}/g,'%').replace(/{\*ctrl\*}/g,'^')
  149.     ke=ke.replace(/\*plus\*/g,modKeyIcon("shift"))
  150.     ke=ke.replace(/{SHIFT}/g,modKeyIcon("shift")+" ")
  151.     ke=ke.replace(/\*alt\*/g,modKeyIcon("alt"))
  152.     ke=ke.replace(/{ALT}/g,modKeyIcon("alt")+" ")
  153.     ke=ke.replace(/\*ctrl\*/g,modKeyIcon("ctrl"))
  154.     ke=ke.replace(/{CTRL}/g,modKeyIcon("ctrl")+" ")
  155.     ke=ke.replace(/{ENTER}/g,modKeyIcon("ENTER"))
  156.     ke=ke.replace(/{BACKSPACE}/g,modKeyIcon("BACKSPACE"))
  157.     ke=ke.replace(/{ESC}/g,modKeyIcon("ESC"))
  158.     ke=ke.replace(/{UP}/g,modKeyIcon("UP"))
  159.     ke=ke.replace(/{DOWN}/g,modKeyIcon("DOWN"))
  160.     ke=ke.replace(/{LEFT}/g,modKeyIcon("LEFT"))
  161.     ke=ke.replace(/{RIGHT}/g,modKeyIcon("RIGHT"))
  162.     ke=ke.replace(/{DELETE}/g,modKeyIcon("DELETE"))
  163.     ke=ke.replace(/{INSERT}/g,modKeyIcon("INSERT"))
  164.     ke=ke.replace(/{HOME}/g,modKeyIcon("HOME"))
  165.     ke=ke.replace(/{END}/g,modKeyIcon("END"))
  166.     ke=ke.replace(/{PGUP}/g,modKeyIcon("PGUP"))
  167.     ke=ke.replace(/{PGDN}/g,modKeyIcon("PGDN"))
  168.     ke=ke.replace(/{NUMLOCK}/g,modKeyIcon("NUMLOCK"))
  169.     ke=ke.replace(/{CAPSLOCK}/g,modKeyIcon("CAPSLOCK"))
  170.     ke=ke.replace(/{TAB}/g,modKeyIcon("TABUL"))
  171.     return ke;
  172. }
  173. function updateWS(){
  174.     var ws="";
  175.  
  176.     if(!inputBoxFocused){
  177.         if(!keyEvents.length){
  178.             if(shiftDown) ws+=modKeyIcon('shift');
  179.             if(ctrlDown) ws+=modKeyIcon('ctrl');
  180.             if(altDown) ws+=modKeyIcon('alt');
  181.         }
  182.         ws+=" "+gfxKE(keyEvents);
  183.     }
  184.     if(ws==pws) return;
  185.     if(keyEvents.length>0 || shiftDown || ctrlDown || altDown){
  186.         dgi("nStatus").style.display="block";
  187.         dgi("nStatus").innerHTML=ws;
  188.     }
  189.     else dgi("nStatus").style.display="none";
  190.     pws=ws;
  191. }
  192.  
  193. function toggleInputBox(){
  194.     if(displayInputBox=!displayInputBox) {
  195.         dd.elements["inputBox"].moveTo(dd.elements["controlBox"].x, dd.elements["controlBox"].y);
  196.         dd.elements["controlBox"].moveTo(-1000,-50);
  197.         sendData("displayInputBox=true&noSt=true",PHP_SELF,false);
  198.     }
  199.     else{
  200.         dd.elements["controlBox"].moveTo(dd.elements["inputBox"].x, dd.elements["inputBox"].y);
  201.         dd.elements["inputBox"].moveTo(-1000,-50);
  202.         sendData("displayInputBox=false&noSt=true",PHP_SELF,false);
  203.     }
  204.     focusKeyInput();
  205. }
  206.  
  207. // Change zoom to 1:1 ratio (type='restore') or to adjust/fit screen (type='adapt')
  208. function changeZoom(type){
  209.     stopLoading();
  210.     fas('',type,winMe.getInnerWidth()-3,winMe.getInnerHeight()-3);
  211. }
  212. // Select screen
  213. function setScreen(nb){
  214.     stopLoading();
  215.     fas(nb,'setScreen',winMe.getInnerWidth()-3,winMe.getInnerHeight()-3,'sync');
  216. }
  217. function fadeMask(){
  218.     if(dd.ie) dgi("mask").style.filter="Alpha(opacity=50, style=0)";
  219.     else dgi("mask").style.background="url('mbg.png')";
  220.     maskFaded=true;
  221.     resumeFocus(0);
  222.     focusIntervalSuspended=1;
  223. }
  224. function showMask(){
  225.     if(inputBoxDragInProgress) return;
  226.     if(dd.ie) dgi("mask").style.filter="Alpha(opacity=1, style=0)";
  227.     else dgi("mask").style.background="transparent";
  228.     maskFaded=false;
  229.     focusIntervalSuspended=0;
  230.     resumeFocus(1);
  231.     inputBoxFocused=false;
  232. }
  233.  
  234. /******************************************************************************
  235.  * Redraw squares
  236.  *****************************************************************************/
  237. function updateSquares(str){
  238.     if(!str){
  239.         for(var i=0; i<D.getElementsByName('sqi').length; i++) dgi("sq"+i).src=rdPath + '/' +Math.floor(1000000*Math.random()) + '/' + i + ".jpg";
  240.         setEvtInterval(refreshAfterNoEvent,1);
  241.         return;
  242.     }
  243.  
  244.     var exp=str.split(";");
  245.  
  246.     sendEventsInProgress=0;
  247.     if(sendEventsImmediately) sendEvents();
  248.     sendEventsImmediately=0;
  249.     for(var i=0; i<exp.length; i++){
  250.         squareSeq[i]=parseInt(squareSeq[i]);
  251.         if(exp[i]>squareSeq[i]) {
  252.             imgBuff[i].src=rdPath + '/' + exp[i] + '/' + i + ".jpg";
  253.             if(debug) {
  254.                 dgi("sq"+i).className="debugSquare";
  255.                 dgi("dbgSq"+i).style.color="red";
  256.                 dgi("dbgSq"+i).innerHTML=exp[i];
  257.             }
  258.             squareSeq[i]=exp[i];
  259.  
  260.         }
  261.         else if(debug) {
  262.             dgi("sq"+i).className="debugSquareNR";
  263.             dgi("dbgSq"+i).style.color="blue";
  264.         }
  265.     }
  266. }
  267.  
  268. /**
  269.  * @desc Function called when buffer image loaded => replace shown image src with this
  270.  */
  271. function imgBuffLoaded(){dgi("sq"+this.alt).src=this.src}
  272.  
  273. // Set mouse position and modifier keys states
  274. function setState(e){
  275.     if (e && e.pageX!=undefined) {
  276.         // Opera shift+arrow mousemove workaround
  277.         if(phpBrowser=='opera' && !e.pageX && !e.pageY){
  278.             // Prev position too far from corner...
  279.             if(XX+YY>50){
  280.                 keyProcessMods(e);
  281.                 return;
  282.             }
  283.         }
  284.         XX=e.pageX;
  285.         YY=e.pageY;
  286.     }
  287.     else {
  288.         XX=event.x+D.body.scrollLeft;
  289.         YY=event.y+D.body.scrollTop;
  290.     }
  291.     YY-=actualOffsetTop(dgi('squares'));
  292.     keyProcessMods(e);
  293. }
  294.  
  295.  
  296. /******************************************************************************
  297.  * Mouse & keyboard Events
  298.  *****************************************************************************/
  299.  
  300. // Add event to events buffer
  301. function addEvent(evt){
  302.     if(!mouseIn && evt.substr(0,3)=="mmv") return;
  303.     if(evt.substr(0,3)=="mmv" && evt.indexOf('undefined')!=-1) return;
  304.     if(mixedEvents.length>0) mixedEvents+="/";
  305.     mixedEvents+=evt;
  306. }
  307. // Send all events to server
  308. function sendEvents(){
  309.     // If window is minimized, don't send
  310.     if(winState=='minMax' || winState=='minNormal') return;
  311.     clearMouseIcons();
  312.  
  313.     // If an event has already been sent but response has not been received
  314.     if(sendEventsInProgress){
  315.         sendEventsImmediately=1; // Indicate updateSquare to send new events as soon as it receive response from server
  316.         eventTimeoutSafetySet=1;
  317.         setTimeout('eventTimeoutSafety()',3*refreshAfterNoEvent); // Set a safety timer in case of no server response (WA)
  318.         return;
  319.     }
  320.     eventTimeoutSafetySet=0;
  321.     sendEventsInProgress=1;
  322.     seq++;
  323.     if(mixedEvents==""){
  324.         if(!altClick) addEvent("mmv;"+XX+";"+YY+";");
  325.         //if(debug) dbgw(seq + "&evts="+mixedEvents);
  326.         sendData("noSt=true&seq=" + seq + "&sendMixedEvents="+mixedEvents,PHP_SELF,false);
  327.         mixedEvents=""; keyEvents=""; updateWS();//clearMouseIcons();
  328.         setEvtInterval(refreshAfterNoEvent);
  329.     }
  330.     else {
  331.         //if(debug && mixedEvents) trace(mixedEvents);
  332.         if(!altClick) addEvent("mmv;"+XX+";"+YY+";");
  333.         command="seq="+seq+"&noSt=true&sendMixedEvents="+encodeURIComponent(mixedEvents);
  334.         //if(debug) dbgw(seq+'&evts='+mixedEvents);
  335.         sendData(command,PHP_SELF,true);
  336.         mixedEvents=""; keyEvents=""; updateWS();//clearMouseIcons();
  337.         setEvtInterval(refreshAfterEvent);
  338.     }
  339. }
  340.  
  341.  
  342. /******************************************************************************
  343.  * Mouse Events
  344.  *****************************************************************************/
  345.  
  346. // IE
  347. function watchScrollBars(){
  348.     if(D.body.scrollLeft==dbsl && D.body.scrollTop==dbst) return;
  349.     dbsl=D.body.scrollLeft;
  350.     dbst=D.body.scrollTop;
  351.     dgi("keys2div").style.left=(dbsl+D.body.offsetWidth/2)+"px";
  352.     dgi("keys2div").style.top=(dbst+D.body.offsetHeight/2)+"px";
  353. }
  354.  
  355. /**
  356.  * Update mouse coordinates, and position elements according to mouse position
  357.  */
  358. function updateMousePos(e){
  359.     setState(e);
  360.     updateWS();
  361.     dgi("nStatus").style.left=(XX+15)+"px";
  362.     dgi("nStatus").style.top=(YY)+"px";
  363.     dgi("keys2div").style.left=(D.body.scrollLeft+winMe.getInnerWidth()/2)+"px";
  364.     dgi("keys2div").style.top=(D.body.scrollTop+winMe.getInnerHeight()/2)+"px";
  365.     XX=Math.round(XX*1.0/zoom);
  366.     YY=Math.round(YY*1.0/zoom);
  367.  
  368.     if(maskDragInProgress && dd.obj && dd.obj.name=="mask") {
  369.         var sel=dgi("select").style;
  370.         if(startX>XX) {sel.left=XX*zoom; sel.width=(startX-XX)*zoom;} else {sel.left=startX*zoom; sel.width=(XX-startX)*zoom;}
  371.         if(startY>YY) {sel.top=YY*zoom; sel.height=(startY-YY)*zoom;} else {sel.top=startY*zoom; sel.height=(YY-startY)*zoom;}
  372.         sel.display="block";
  373.     }
  374. }
  375. /**
  376.  * Add a mouse event (rc, lc, ld, lu) to buffer
  377.  */
  378. function updateMouseEvents(action){
  379.     if(maskFaded) return;
  380.     setEvtInterval(0); // Clear timeout so nothing happends during this process
  381.  
  382.     if(action=='rd'||action=='ru') setMouseIcons('<div style="position:absolute;top:'+(YY*zoom-16)+'px;left:'+(XX*zoom-16)+'px;">'+dgi("mouseR").innerHTML+'</div>');
  383.     else{
  384.         if(action!='move') setMouseIcons('<div style="position:absolute;top:'+(YY*zoom-16)+'px;left:'+(XX*zoom-16)+'px;">'+dgi("mouseL").innerHTML+'</div>');
  385.     }
  386.  
  387.     var mouseEvent=action+";"+XX+";"+YY+";";
  388.  
  389.     if(shiftDown) {mouseEvent+="+"; shiftUsed=true;}
  390.     if(altDown) {mouseEvent+="%"; altUsed=true;}
  391.     if(ctrlDown) {mouseEvent+="^"; ctrlUsed=true;}
  392.     addEvent("m"+mouseEvent);
  393.     if(action!='ld' && action!='rd') setEvtInterval(eventMaxDurationMouse);
  394. }
  395.  
  396. // Mouse down on mask (start dragging)
  397. function preDrag(){
  398.     if(altClick) return;
  399.  
  400.     if(dd.obj.name=="mask"){
  401.         startX=XX; startY=YY;
  402.         maskDragInProgress=true;
  403.         var sel=dgi("select").style; sel.left=XX*zoom; sel.top=YY*zoom; sel.height=0; sel.width=0; sel.display="block";
  404.         if(dd.e.button>1) updateMouseEvents("rd"); else    updateMouseEvents("ld");
  405.     }
  406.     if(dd.obj.name=="inputBox" || dd.obj.name=="controlBox" || dd.obj.name=="clipboardBox") inputBoxDragInProgress=true;
  407.     focusKeyInput();
  408. }
  409.  
  410. // Mouse up on mask (done dragging)
  411. function preDrop(){
  412.     maskDragInProgress=false;
  413.     dgi("select").style.display="none";
  414.     if(dd.obj.name=="inputBox" || dd.obj.name=="controlBox" || dd.obj.name=="clipboardBox") inputBoxDragInProgress=false;
  415.     else {
  416.         if(dd.e.button>1) updateMouseEvents("ru"); else    updateMouseEvents("lu");
  417.     }
  418. }
  419.  
  420. // Right-click action
  421. //function onrightclick(e){updateMouseEvents("rc")}
  422.  
  423. /******************************************************************************
  424.  * Keyboard events
  425.  *****************************************************************************/
  426. function keyAddSeq(sq){
  427.     //addEvent("mmv;"+XX+";"+YY+";");
  428.     addEvent("k"+protect(sq));
  429.     keyEvents+=sq.replace(/ /," ");
  430.     updateWS();
  431.     setEvtInterval(eventMaxDurationKb);
  432. }
  433.  
  434. function keyStrikeAdd(k){
  435.     var key="";
  436.     if(ctrlDown) key+="^";
  437.     if(altDown) key+="%";
  438.     if(k=="+") k="{+}";
  439.     if(k=="%") k="{%}";
  440.     if(k=="^") k="{^}";
  441.     if(k=="~") k="{~}";
  442.     if(k=="{") k="{{}";
  443.     if(k=="}") k="{}}";
  444.     if(k=="[") k="{[}";
  445.     if(k=="]") k="{]}";
  446.     if(key=='^%' && k=='+{DELETE}') k='{DELETE}'; // Ctrl-Alt-Suppr
  447.  
  448.     shiftUsed=false;
  449.     altUsed=false;
  450.     ctrlUsed=false;
  451.  
  452.     keyAddSeq(key+k);
  453. }
  454. var lastModKeys;
  455. function keyProcessMods(e){
  456.     kc=27;
  457.     if(e){ // Gecko
  458.         kc=e.which;
  459.         if(e.shiftKey) keySetMod("shift",true); else keySetMod("shift",false);
  460.         if(e.altKey) keySetMod("alt",true); else keySetMod("alt",false);
  461.         if(e.ctrlKey) keySetMod("ctrl",true); else keySetMod("ctrl",false);;
  462.     }
  463.     else if(W.event){ // IE & Opera
  464.         kc=W.event.keyCode;
  465.         if(W.event.shiftKey) keySetMod("shift",true); else keySetMod("shift",false);
  466.         if(W.event.altKey) keySetMod("alt",true); else keySetMod("alt",false);
  467.         if(W.event.ctrlKey) keySetMod("ctrl",true); else keySetMod("ctrl",false);
  468.     }
  469.     if(lastModKeys!=" "+altDown+ctrlDown+shiftDown) updateWS();
  470.     lastModKeys=" "+altDown+ctrlDown+shiftDown;
  471.     return kc;
  472. }
  473. function keySetMod(mod,val){
  474.     if(mod=='alt') {
  475.         if(!altDown && val) altUsed=true;
  476.         altDown=val;
  477.     }
  478.     if(mod=='ctrl') {
  479.         if(!ctrlDown && val) ctrlUsed=true;
  480.         ctrlDown=val;
  481.     }
  482.     if(mod=='shift') {
  483.         if(!shiftDown && val) shiftUsed=true;
  484.         shiftDown=val;
  485.     }
  486. }
  487. function keyProcessInput(){
  488.     if(dgi('keys2').value.length>0 && dgi('keys2').value.length<3) { // <3 to correct paste problem (ctr-v in input)
  489.         keyStrikeAdd(dgi('keys2').value.replace(/\n/,'{ENTER}'));
  490.         dgi('keys2').value="";
  491.         return true;
  492.     }
  493.     return false;
  494. }
  495. function keyDown(e){
  496.     if(maskFaded) return;
  497.     if((new Date()).getTime()-lastKeyDownDate<5) return;
  498.     lastKeyDownDate=(new Date()).getTime();
  499.     kc=keyProcessMods(e);
  500.     if(inputsDisabled) return;
  501.     keyPressedCalled=1;
  502.     setTimeout('keyPressed('+kc+')',1);
  503.     if((ctrlDown && !altDown) || sk[kc]) return false;
  504. }
  505. function keyPress(e){
  506.     if(maskFaded) return;
  507.     kc=keyProcessMods(e);
  508.     if(inputsDisabled) return;
  509.     if(keyPressedCalled) return;
  510.     if(keyProcessInput()) keyCancelkeyPressed=1;
  511. }
  512. function keyUp(e){
  513.     if(maskFaded) return;
  514.     kc=keyProcessMods(e);
  515.  
  516.     if(inputsDisabled) return;
  517.  
  518.     if(!keyPressedCalled) keyProcessInput();
  519.     mods="";
  520.     if(altDown) mods+="%";
  521.     if(ctrlDown) mods+="^";
  522.     if(shiftDown) mods+="+";
  523.     if(kc==18 && altUsed) {altUsed=false;ctrlUsed=false;shiftUsed=false;keyAddSeq(mods+'{ALT}');}
  524.     if(kc==17 && ctrlUsed) {altUsed=false;ctrlUsed=false;shiftUsed=false;keyAddSeq(mods+'{CTRL}');}
  525.     if(kc==16 && shiftUsed) {altUsed=false;ctrlUsed=false;shiftUsed=false;keyAddSeq(mods+'{SHIFT}');}
  526. }
  527. function keyPressed(kc){
  528.     keyPressedCalled=0;
  529.     if(kc==86 && ctrlDown) dgi("keys2").value='';
  530.     if(!keyProcessInput()){
  531.         if(sk[kc]) {
  532.             keyStrikeAdd(((shiftDown)?'+'+sk[kc]:sk[kc]));
  533.         }
  534.         else{
  535.             if(kc<32) return;
  536.             if(String.fromCharCode(kc)!==false) {
  537.                 if(ctrlDown || altDown) keyStrikeAdd(String.fromCharCode(kc).toLowerCase());
  538.             }
  539.         }
  540.     }
  541. }
  542.  
  543. // Send keys from keys input box
  544. function sendKeys(){
  545.     var cont;
  546.     if(winMe.addControls) cont=parent; else cont=window;
  547.     if(cont.dgi("keys").value.length==0) return;
  548.     addEvent("mmv;"+XX+";"+YY+";");
  549.     addEvent("k"+cont.dgi("keys").value);
  550.     sendEvents();
  551.     cont.dgi("keys").value="";
  552. }
  553. // Clear keys input box
  554. function clearKeys(){
  555.     var cont=(winMe.addControls)?parent:W;
  556.     cont.dgi("keys").value="";
  557. }
  558.  
  559. function insertKey(){
  560.     var cont;
  561.     if(winMe.addControls) cont=parent; else cont=window;
  562.  
  563.     if(cont.dgi("specialKeySelect").value=='Cancel') return;
  564.     cont.dgi("keys").value+=cont.dgi("specialKeySelect").value;
  565.     cont.dgi("keys").focus();
  566.     cont.dgi("specialKeySelect").value='Cancel';
  567. }
  568. function focusKeyInput(){
  569.     if(maskFaded || displayInputBox || clipboardBoxFocused) {
  570.         resumeFocus(0);
  571.         return;
  572.     }
  573.     updateWS();
  574.     dgi("keys2").focus();
  575. }
  576. // Called onfocus from winbar
  577. function focusKeys(){
  578.     inputBoxFocused=true;
  579.     updateWS();
  580. }
  581.  
  582.  
  583. /******************************************************************************
  584.  * Clipboard management
  585.  *****************************************************************************/
  586.  
  587. function sendClipboard(clipboardContent){
  588.     if(phpBrowser=='ie'){
  589.         if(typeof clipboardData != 'undefined') {
  590.             addEvent("mmv;"+XX+";"+YY+";");
  591.             addEvent("cp"+protect(clipboardData.getData("Text")));
  592.             sendEvents();
  593.             blink("clipboardOutBt",1);
  594.         }
  595.         else alert(captionClipboardNoData);
  596.     }
  597.     else{
  598.         if(!clipboardContent){
  599.             showSendClipboardBox();
  600.         }
  601.         else{
  602.             clipboardContent=dgi("clipboardText").value;
  603.             addEvent("mmv;"+XX+";"+YY+";");
  604.             addEvent("cp"+protect(clipboardContent));
  605.             sendEvents();
  606.             blink("clipboardOutBt",1);
  607.             closeClipboardBox();
  608.         }
  609.     }
  610. }
  611. function requestClipboard(){
  612.     addEvent("cg");
  613.     sendEvents();
  614.     blink("clipboardInBt",1);
  615. }
  616. function downloadClipboardFiles(){fas('','downloadClipboardFiles');}
  617. function pasteInLocalClipboardIE(data){
  618.     dgi("clipboardText").innerText = unprotect(data);
  619.     var tr = dgi("clipboardText").createTextRange();
  620.     tr.execCommand("RemoveFormat");
  621.     tr.execCommand("Copy");
  622.     blink("clipboardInBt",3);
  623. }
  624. function resetClipboardBox(){dgi("clipboardText").value ="";}
  625. function addToClipboardBox(data){dgi("clipboardText").value+=data;}
  626. function pasteInLocalClipboard(data){
  627.     dgi("clipboardText").value=unprotect(data);
  628.     dgi("clipboardText").select();
  629.     showGetClipboardBox();
  630.     blink("clipboardInBt",3);
  631. }
  632. function closeClipboardBox(){
  633.     clipboardBoxFocused=false;
  634.     dgi("clipboardText").value='';
  635.     dd.elements["clipboardBox"].moveTo(-1000,50);
  636. }
  637. function showGetClipboardBox(){
  638.     dgi("clipboardSendBt").style.display='none';
  639.     dgi("clipboardCaptionRequest").style.display='inline';
  640.     dgi("clipboardCaptionSend").style.display='none';
  641.     dgi("clipboardCaptionPaste").style.display='none';
  642.     dgi("clipboardText").focus();
  643.     dd.elements["clipboardBox"].maximizeZ();
  644.     dd.elements["clipboardBox"].moveTo(20,50);
  645. }
  646. function showSendClipboardBox(){
  647.     dgi("clipboardSendBt").style.display='block';
  648.     dgi("clipboardCaptionRequest").style.display='none';
  649.     dgi("clipboardCaptionSend").style.display='inline';
  650.     dgi("clipboardCaptionPaste").style.display='inline';
  651.     dgi("clipboardText").focus();
  652.     dd.elements["clipboardBox"]
  653.     dd.elements["clipboardBox"].maximizeZ();
  654.     dd.elements["clipboardBox"].moveTo(Math.max(dd.elements["controlBox"].x,dd.elements["inputBox"].x),Math.max(dd.elements["controlBox"].y,dd.elements["inputBox"].y)+80);
  655. }
  656.  
  657.  
  658. /******************************************************************************
  659.  * Alternate click (iPhone)
  660.  *****************************************************************************/
  661. function altClickShowMenu(){
  662.     if(altClickDragInProgress) {altClickAction('dragDrop'); return;}
  663.  
  664.     altClickX=Math.round(mouseX*1.0/zoom);
  665.     altClickY=Math.round((mouseY-actualOffsetTop(dgi('squares')))*1.0/zoom);
  666.     var iw=24/iPhoneZoom();
  667.     dgi('target').style.width=(2*iw)+'px';
  668.     dgi('target').style.height=(2*iw)+'px';
  669.     dgi('target').style.left=(mouseX-iw)+'px'; dgi('target').style.top=(mouseY-iw)+'px';dgi('target').style.display='block';
  670.  
  671.     if(altClickMenuShown) return;
  672.  
  673.     setEvtInterval(0); // Stop sending events while alternate click menu is displayed
  674.  
  675.     var bx=window.pageXOffset + window.innerWidth/2 - iw;
  676.     var by=window.pageYOffset + iw*4;
  677.     for(var i=0;i<dgn('acBt','all').length;i++){
  678.         dgn('acBt',i).className='acBt';
  679.         if(dgn('acBt',i).id!='acLc' && dgn('acBt',i).id!='acRc'){
  680.         dgn('acBt',i).style.padding=(iw/4)+'px';
  681.         dgn('acBt',i).firstChild.style.width=(2*iw)+'px'; dgn('acBt',i).firstChild.style.height=(2*iw)+'px';
  682.         }
  683.         else{
  684.         dgn('acBt',i).style.padding=(iw/2)+'px';
  685.         dgn('acBt',i).firstChild.style.width=(3*iw/2)+'px'; dgn('acBt',i).firstChild.style.height=(3*iw/2)+'px';
  686.         }
  687.         dgn('acBt',i).style.zIndex=1001;
  688.         switch(dgn('acBt',i).id){
  689.             case 'acLc':ofx=-1.5;ofy=-1.5;break;
  690.             case 'acDbl':ofx=0;ofy=-1.5;break;
  691.             case 'acRc':ofx=1.5;ofy=-1.5;break;
  692.             case 'acDrag':ofx=-1.5;ofy=0;break;
  693.             case 'acMove':ofx=0;ofy=0;break;
  694.             case 'acCancel':ofx=1.5;ofy=0;break;
  695.             default:ofx=0;ofy=1;break;
  696.         }
  697.         ofx*=2*iw;ofy*=2*iw;
  698.         dgn('acBt',i).style.left=(bx+ofx)+'px'; dgn('acBt',i).style.top=(by+ofy)+'px';
  699.     }
  700.     ofx=-3*iw;ofy=3*iw;
  701.     dgi('acText').style.width=(8*iw)+'px';
  702.     dgi('acText').style.height=(3*iw)+'px';
  703.     dgi('acText').style.padding=(iw/4)+'px';
  704.     dgi('acText').style.left=(bx+ofx)+'px'; dgi('acText').style.top=(by+ofy)+'px';
  705.     var snodes=dgi('acText').firstChild;
  706.     dgi('acText').style.zIndex=1001;
  707.     var fs=iw+'px';
  708.     dgi('acText').style.fontSize=iw;
  709.     dgi('acTxtInput').style.fontSize=iw*0.6;
  710.     dgi('acKeySelect').style.fontSize=iw*0.6;
  711.  
  712.     while (snodes!=undefined && snodes!=null) {
  713.         if(snodes.style) snodes.style.fontSize='30px';
  714.         snodes=snodes.nextSibling;
  715.     }
  716.     altClickMenuShown=1;
  717. }
  718. function iPhoneZoom(){return Math.abs(window.orientation)==90?480/window.innerWidth:320/window.innerWidth;}
  719. function updateOrientation(){}
  720. function altClickHideMenu(){
  721.     for(var i=0;i<dgn('acBt','all').length;i++) dgn('acBt',i).style.left='-2000px';
  722.     dgi('acText').style.left='-2000px';
  723.     dgi('target').style.left='-2000px';
  724.     altClickMenuShown=0;
  725. }
  726. function altClickAction(action){
  727.     var mod=((dgi('acShift').checked)?'+':'')+((dgi('acAlt').checked)?'%':'')+((dgi('acCtrl').checked)?'^':'');
  728.     switch(action){
  729.         case 'dragPick':
  730.         altClickDragInProgress=1;altClickHideMenu();return;
  731.         break;
  732.         case 'dragDrop':
  733.         XX=Math.round(mouseX*1.0/zoom);
  734.         YY=Math.round((mouseY-actualOffsetTop(dgi('squares')))*1.0/zoom);
  735.  
  736.         altClickDragInProgress=0;
  737.         addEvent('mld;'+altClickX+';'+altClickY+';'+mod); addEvent('mlu;'+XX+';'+YY+';'+mod);
  738.         break;
  739.         case 'dbl':
  740.         addEvent('mlc;'+altClickX+';'+altClickY+';'+mod);    addEvent('mlc;'+altClickX+';'+altClickY+';'+mod);
  741.         break;
  742.         case 'lc':
  743.         addEvent('mlc;'+altClickX+';'+altClickY+';'+mod);
  744.         break;
  745.         case 'rc':
  746.         addEvent('mrc;'+altClickX+';'+altClickY+';'+mod);
  747.         break;
  748.         case 'mv':
  749.         addEvent('mmv;'+altClickX+';'+altClickY+';'+mod);
  750.         break;
  751.     }
  752.     sendEvents();
  753.     altClickHideMenu();
  754. }
  755. function altClickCheck(cb){
  756.     var cpt=dgi(cb).nextSibling;
  757.     cpt.style.color=(dgi(cb).checked)?'':'red';
  758.     dgi(cb).checked=(dgi(cb).checked)?false:'checked';
  759. }
  760. function altClickTxt(){
  761.     addEvent("k"+protect(dgi('acTxtInput').value));
  762.     dgi('acTxtInput').value='';
  763.     sendEvents();
  764.     altClickHideMenu();
  765. }
  766. function init(){
  767.     // Set inputBox and controlBox dimensions so content fit (WA)
  768.     inputBoxesResetSize();
  769.  
  770.     // Init cache images
  771.     for(var i=0;i<squaresNb;i++){
  772.         imgBuff[i]=new Image();
  773.         imgBuff[i].alt=i;
  774.         imgBuff[i].onload=imgBuffLoaded;
  775.     }
  776.  
  777.     // Set squares srcs
  778.     updateSquares();
  779.  
  780.     // Disable context menu
  781.     D.oncontextmenu=function(){return false}
  782. }
  783.  
  784.